﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EpsiRisk.DonneesPlateau;
using System.Threading;

namespace EpsiRisk.MoteurJeu
{
    public static class ClassMoteurIA
    {
        public static Thread threadmoteurIA;

        /// <summary>
        /// Initialisation de l'IA pour un joueur machine
        /// chaque cas est une phase différente
        /// </summary>
        public static void JoueurMachine()
        {
            List<ClassSousTerritoire> ListeAJouer;
            switch (ClassEtatPartie.phase)
            {
                //Phase renfort
                //Distribution des armées au lancement du jeu
                case 0:
                    ListeAJouer = ClassIntelligenceArtificielle.meilleur_regroupement();
                    ClassIntelligenceArtificielle.eval_regroupement_pays(ListeAJouer);
                    while (ClassEtatPartie.renforts != 0)
                    {
                        foreach (ClassSousTerritoire st in ListeAJouer)
                        {
                            bool aaffecter = false;
                            foreach (ClassSousTerritoire sTvoisin in st.Voisins)
                            {
                                if (sTvoisin.Proprietaire != ClassEtatPartie.joueurCourant())
                                {
                                    aaffecter = true;
                                }
                            }
                            if (aaffecter)
                            {
                                if (ClassEtatPartie.renforts * st.coefIA < 1)
                                {
                                    st.ajouterSoldat(1);
                                    ClassEtatPartie.renforts -= 1;
                                }
                                else
                                {
                                    st.ajouterSoldat((int)(ClassEtatPartie.renforts * st.coefIA));
                                    ClassEtatPartie.renforts -= (int)(ClassEtatPartie.renforts * st.coefIA);
                                }
                            }
                            if (ClassEtatPartie.renforts == 0)
                                break;
                        }
                    }
                    //ListeAJouer[0].ajouterSoldat(ClassEtatPartie.renforts);
                    ClassEtatPartie.renforts = 0;
                    //pause avant le changement de phase
                    Thread.Sleep(3000);
                    ClassEtatPartie.terminerPhase();

                    break;
                //phase attaque
                case 1:
                    ListeAJouer = ClassIntelligenceArtificielle.meilleur_regroupement();
                    ClassSousTerritoire EventuelAttaqué = new ClassSousTerritoire();
                    ClassSousTerritoire EventuelAttanquant = new ClassSousTerritoire();
                    int count = 30;
                    do
                    {
                        count--;
                        EventuelAttaqué = new ClassSousTerritoire();
                        EventuelAttanquant = new ClassSousTerritoire();
                        foreach (ClassSousTerritoire st in ListeAJouer)
                        {
                            if (st.nbArmees > 1)
                            {
                                for (int nbVoisin = 1; nbVoisin < st.Voisins.Count; nbVoisin++)
                                {
                                    if (st.Voisins[nbVoisin].Proprietaire != ClassEtatPartie.joueurCourant())
                                    {
                                        if (ClassDonneesGlobales.plateauCourant.getContinent(st) == ClassDonneesGlobales.plateauCourant.getContinent(st.Voisins[nbVoisin]) && st.Voisins[nbVoisin].nbArmees < st.nbArmees)
                                        {
                                            if (st.nbArmees > EventuelAttanquant.nbArmees)
                                            {
                                                EventuelAttanquant = st;
                                                EventuelAttaqué = st.Voisins[nbVoisin];
                                            }
                                        }
                                        else if (st.Voisins[nbVoisin].nbArmees < st.nbArmees)
                                        {
                                            if (st.nbArmees > EventuelAttanquant.nbArmees)
                                            {
                                                EventuelAttanquant = st;
                                                EventuelAttaqué = st.Voisins[nbVoisin];
                                            }
                                        }
                                    }
                                }

                            }
                        }
                        if (EventuelAttanquant.Voisins.Contains(EventuelAttaqué))
                        {
                            ClassPhaseAttaque.setAttaquant(EventuelAttanquant);
                            ClassPhaseAttaque.setDefenseur(EventuelAttaqué);
                            ClassPhaseAttaque.NbAttaquants = Math.Min(3, EventuelAttanquant.nbArmees - 1);
                            ClassPhaseAttaque.attaque();
                            Thread.Sleep(5000);
                            //while (!(ClassDonneesGlobales.zoneJeu.desactiveClicTerritoire))
                            //{
                            //    Thread.Sleep(10);
                            //}
                            ClassPhaseAttaque.gestion_resultat.Join();
                            Thread.Sleep(1000);
                            ClassDonneesGlobales.zoneLancementDes.retourselectionattaquant();

                            //pause avant le changement de phase
                        }
                    } while (EventuelAttanquant.nbArmees >= EventuelAttaqué.nbArmees && count > 0);
                    ClassEtatPartie.terminerPhase();

                    break;
                //phase deplacement
                case 2:
                    ListeAJouer = ClassIntelligenceArtificielle.meilleur_regroupement();
                    bool entourerAmi = false;
                    while (entourerAmi == false)
                    {
                        foreach (ClassSousTerritoire st in ListeAJouer)
                        {
                            entourerAmi = true;
                            for (int nbVoisin = 0; nbVoisin < st.Voisins.Count; nbVoisin++)
                            {
                                if (st.Voisins[nbVoisin].Proprietaire == ClassEtatPartie.joueurCourant() && st.nbArmees > 2)
                                {
                                    entourerAmi = false;
                                }
                            }
                            if (entourerAmi == false)
                            {
                                //ClassSousTerritoire Destination;
                                foreach (ClassSousTerritoire dest in st.Voisins)
                                {
                                        st.deplacerSoldats(dest, st.nbArmees - 2);
                                }
                            }
                        }
                    }
                    //pause avant le changement de phase
                    Thread.Sleep(6000);
                    ClassEtatPartie.terminerPhase();

                    break;
                case 3:
                    ListeAJouer = ClassIntelligenceArtificielle.meilleur_regroupement();
                    ClassIntelligenceArtificielle.eval_regroupement_pays(ListeAJouer);
                    while (ClassEtatPartie.renforts != 0)
                    {
                        foreach (ClassSousTerritoire st in ListeAJouer)
                        {
                            bool aaffecter = false;
                            foreach (ClassSousTerritoire sTvoisin in st.Voisins)
                            {
                                if (sTvoisin.Proprietaire != ClassEtatPartie.joueurCourant())
                                {
                                    aaffecter = true;
                                }
                            }
                            if (aaffecter)
                            {
                                if (ClassEtatPartie.renforts * st.coefIA < 1)
                                {
                                    st.ajouterSoldat(1);
                                    ClassEtatPartie.renforts -= 1;
                                }
                                else
                                {
                                    st.ajouterSoldat((int)(ClassEtatPartie.renforts * st.coefIA));
                                    ClassEtatPartie.renforts -= (int)(ClassEtatPartie.renforts * st.coefIA);
                                }
                            }
                            if (ClassEtatPartie.renforts == 0)
                                break;
                        }
                    }
                    //ListeAJouer[0].ajouterSoldat(ClassEtatPartie.renforts);
                    ClassEtatPartie.renforts = 0;

                    //pause avant le changement de phase
                    Thread.Sleep(3000);

                    /*if (ClassEtatPartie.indexJoueurCourant == ClassJoueur.listeJoueurs.Count - 1)
                        {
                            ///ClassEtatPartie.passerAuJoueurSuivant();
                            ClassEtatPartie.phase = 0;
                            ClassEtatPartie.initialiserPhaseRenforts();
                            ClassEtatPartie.renforts = ClassEtatPartie.calculerRenforts(ClassEtatPartie.joueurCourant());
                        }
                        else
                        {
                            ClassEtatPartie.passerAuJoueurSuivant();
                            ClassEtatPartie.phase = 3;
                            ClassEtatPartie.initialiserPhaseRenforts();
                            ClassEtatPartie.renforts = 15;
                        }*/
                    ClassEtatPartie.terminerPhase();
                    break;
                default:
                    throw new NotImplementedException();
            }
        }
    }
}
